package org.example.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * rdd的算子，也就是rdd的方法
 *
 * distinct 去重
 *
 */
object Spark09_RDD_Operator_Distinct {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val context = new SparkContext(conf)

    val rdd = context.makeRDD(List(1,2,3,1,2,3))

    /**
     * 底层原理
     *
     * map(x=>(x,null)).reduceByKey((x,_)=>x).map(_._1)
     *
     * (1,null)(2,null)(3,null)(1,null)
     * 首先变成这样的元组，后面是空
     * 然后对相同的key进行reduce操作，但是他总是会返回第一个null，后面都丢弃
     * 也就是
     * (null,null) => null 因此最后只会返回 (1,null)
     *
     * 然后，最后一步，只取元组的第一个也就是1，完成去重
     */

    val disRdd: RDD[Int] = rdd.distinct()

    context.stop();
  }
}
